#ifndef __MY_HOT__
#define __MY_HOT__
#include <unistd.h>
#include <memory>
#include "dataManager.hpp"

//在多个文件中使用 _dataManager 确保它在每个文件中都被声明为extern 但只在一个源文件中被定义
//声明全局变量_dataManager 在其他文件中定义 
//extern cloudBackup::DataManager *_dataManager;
extern std::shared_ptr<cloudBackup::DataManager> _dataManager;

namespace cloudBackup
{
	class HotManager
	{
	private:
		std::string _backupDir; // 备份文件路径
		std::string _zipDir;	// 压缩文件路径
		std::string _zipSuffix; // 压缩文件后缀
		int _hotTime;			// 热点判定时间间隔

		// 热点文件-返回真
		bool isHot(const std::string &filename)
		{
			FileUtil fileUtil(filename);
			time_t last_atime = fileUtil.LastATime();
			time_t cur_time = time(NULL);
			if (cur_time - last_atime > _hotTime)
				return false;
			return true;
		}

	public:
		HotManager()
		{
			Config *config = Config::GetInstance();
			_backupDir = config->GetBackupDir();
			_zipDir = config->GetZipDir();
			_zipSuffix = config->GetZipSuffix();
			_hotTime = config->GetHotTime();
		}

		// 死循环
		bool RunHotManager()
		{
			while (true)
			{
				// 1. 遍历备份目录 获取所有文件名
				FileUtil fileUtil(_backupDir);
				std::vector<std::string> array;
				fileUtil.ScanDirectory(&array);

				// 2. 遍历判断文件是否是热点文件
				for (auto &file : array)
				{
					if (isHot(file) == true) // 热点文件则不需要特别处理
						continue;
					// 3. 获取文件的备份信息
					BackupAInfo info;
					// 实际文件存在 但hashmap中没有备份信息 考虑差错：设置该文件的备份信息
					if (_dataManager->GetOneByFilePath(file, &info) == false)
						info.NewBackupAInfo(file);

					// 3. 对非热点文件进行压缩处理
					FileUtil tmp(file);
					tmp.Compress(info._zipPath);

					// 4. 删除源文件 修改备份信息
					tmp.Remove();
					info._isZipped = true;
					_dataManager->Update_Table(info);
				}
				usleep(1000); // 避免空目录循环遍历 消耗cpu资源过高
			}
			return true;
		}
	};
}

#endif //__MY_HOT__
